<?php
header("Content-type:text/html;charset=utf-8");

/**
 * Created by PhpStorm.
 * User: huy
 * Date: 2017/3/28
 * Time: 18:27
 */
class AlipayControl extends Control{
    public function __construct(){
        parent::__construct();
        ini_set("display_errors", "On");
        load_config('alipay/onload');
        load_config('alipay/alipayConfig');
        load_library('alipay/Corefunction');
        load_library('alipay/Notify');
        load_library('alipay/Submit');
        load_library('alipay/Md5function');
    }

    public function index(){
        $this->doalipay();
    }

    /**
     * doalipay   将接口文件包下alipayapi.php内容复制过来
     */
    public function doalipay(){
        /**********************读取配置文件**************************/
        $alipay_config = new AlipayConfig();
        $alipay_config = $alipay_config->alipayconfig();
        /**************************请求参数**************************/
        $payment_type = 1; //支付类型
        $notify_url   = $alipay_config['notify_url'];
        $return_url   = $alipay_config['return_url'];
        $seller_email = $alipay_config['seller_id'];
        $out_trade_no = $_POST['WIDout_trade_no'];//商户订单号，商户网站订单系统中唯一订单号，必填
        $subject      = $_POST['WIDsubject']; //订单名称，必填
        //付款金额，必填
        $total_fee = $_POST['WIDtotal_fee'];
        //收银台页面上，商品展示的超链接，必填
        $show_url = $_POST['WIDshow_url'];
        //商品描述，可空
        $body = $_POST['WIDbody'];
        //防钓鱼时间戳  若要使用请调用类文件submit中的query_timestamp函数
        $anti_phishing_key = '';
        //客户端IP地址
        $exter_invoke_ip = $_SERVER['REMOTE_ADDR'];
        /*************************构造要请求的参数数组，无需改动***********************************/
        $parameter = array(
            "service"        => $alipay_config['service'],
            "partner"        => $alipay_config['partner'],
            "seller_id"      => $alipay_config['seller_id'],
            "payment_type"   => $alipay_config['payment_type'],
            "notify_url"     => $notify_url,
            "return_url"     => $return_url,
            "_input_charset" => trim(strtolower($alipay_config['input_charset'])),
            "out_trade_no"   => $out_trade_no,
            "subject"        => $subject,
            "total_fee"      => $total_fee,
            "show_url"       => $show_url,
            //"app_pay"	=> "Y",//启用此参数能唤起钱包APP支付宝
            "body"           => $body,
            //其他业务参数根据在线开发文档，添加参数.文档地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.2Z6TSk&treeId=60&articleId=103693&docType=1
            //如"参数名"	=> "参数值"   注：上一个参数末尾需要“,”逗号。

        );
        //建立请求
        $alipaySubmit = new AlipaySubmit($alipay_config);
        $html_text    = $alipaySubmit->buildRequestForm($parameter, "get", "确认");
        echo $html_text;
    }

    /******************************
     * 服务器异步通知页面方法
     * 其实这里就是将notify_url.php文件中的代码复制过来进行处理
     *******************************/
    public function notifyurl(){
        //require_once("alipay.config.php");
        //require_once("lib/alipay_notify.class.php");
        /**********************读取配置文件**************************/
        $alipay_config = new AlipayConfig();
        $alipay_config = $alipay_config->alipayconfig();
        //计算得出通知验证结果
        $alipayNotify  = new AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyNotify();

        if($verify_result){//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代

            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——

            //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
            //商户订单号
            $out_trade_no = $_POST['out_trade_no'];
            //支付宝交易号
            $trade_no = $_POST['trade_no'];
            //交易状态
            $trade_status = $_POST['trade_status'];
            $total_fee    = $_POST['total_fee'];  //交易金额
            $notify_id    = $_POST['notify_id'];  //通知校验ID
            $notify_time  = $_POST['notify_time'];  //通知发送时间
            $buyer_email  = $_POST['buyer_email'];  //买家支付宝账号
            /******组织参数 **************/
            $parameter = array(
                'out_trade_no' => $out_trade_no,
                'trade_no'     => $trade_no,
                'total_fee'    => $total_fee,
                'trade_status' => $trade_status,
                'notify_id'    => $notify_id,
                'notify_time'  => $notify_time,
                'buyer_email'  => $buyer_email
            );

            if($_POST['trade_status'] == 'TRADE_FINISHED'){
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                //如果有做过处理，不执行商户的业务程序

                //注意：
                //退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知

                //调试用，写文本函数记录程序运行情况是否正常
                //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
            }else{
                if($_POST['trade_status'] == 'TRADE_SUCCESS'){
                    if(!checkorderstatus($out_trade_no)){
                        orderhandle($parameter);
                        //进行订单处理，并传送从支付宝返回的参数；
                    }
                    //判断该笔订单是否在商户网站中已经做过处理
                    //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                    //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                    //如果有做过处理，不执行商户的业务程序

                    //注意：
                    //付款完成后，支付宝系统发送该交易状态通知

                    //调试用，写文本函数记录程序运行情况是否正常
                    //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
                }
            }

            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

            echo "success";        //请不要修改或删除
        }else{
            //验证失败
            echo "fail";

            //调试用，写文本函数记录程序运行情况是否正常
            //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
        }
    }

    /**
     * 页面跳转处理方法；
     * 这里其实就是将return_url.php这个文件中的代码复制过来，进行处理；
     */
    public function returnurl(){
        /**********************读取配置文件**************************/
        $alipay_config = new AlipayConfig();
        $alipay_config = $alipay_config->alipayconfig();
        //计算得出通知验证结果
        $alipayNotify  = new AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyReturn();
        if($verify_result){//验证成功
            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代码

            //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
            //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表
            //商户订单号
            $out_trade_no = $_GET['out_trade_no'];
            //支付宝交易号
            $trade_no = $_GET['trade_no'];
            //交易状态
            $trade_status = $_GET['trade_status'];
            $total_fee    = $_GET['total_fee'];         //交易金额
            $notify_id    = $_GET['notify_id'];         //通知校验ID。
            $notify_time  = $_GET['notify_time'];       //通知的发送时间。
            $buyer_email  = $_GET['buyer_email'];       //买家支付宝帐号；
            /**********组织参数********************/
            $parameter = array(
                "out_trade_no" => $out_trade_no,      //商户订单编号；
                "trade_no"     => $trade_no,          //支付宝交易号；
                "total_fee"    => $total_fee,         //交易金额；
                "trade_status" => $trade_status,      //交易状态
                "notify_id"    => $notify_id,         //通知校验ID。
                "notify_time"  => $notify_time,       //通知的发送时间。
                "buyer_email"  => $buyer_email,       //买家支付宝帐号
            );

            if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS'){
                if(!checkorderstatus($out_trade_no)){
                    orderhandle($parameter);  //进行订单处理，并传送从支付宝返回的参数；
                }
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //如果有做过处理，不执行商户的业务程序
                header("location.href='xxxx'");//跳转到支付成功页面
            }else{
                echo "trade_status=" . $_GET['trade_status'];
                header("location.href='xxxx'");//跳转到支付失败页面
            }

            echo "验证成功<br />";

            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        }else{
            //验证失败
            //如要调试，请看alipay_notify.php页面的verifyReturn函数
            echo "验证失败";
        }
    }
}